//By Tyler Gerritsen //2017-11-25 //vtgerritsen@gmail.com /* Example of using watchdog timer on ATTINY85. Timing appears to be correct. THis example executes code every 10 seconds. ADC turns on for each execution (not required, but shown for future reference). */ #include #include #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif volatile boolean f_wdt = 1; byte sleepCounter; void setup() { setup_watchdog(6); // 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms,6=1 sec,7=2 sec, 8=4 sec, 9= 8sec pinMode(0, OUTPUT); //Part of test code, blink pin 0 every time wakeup } void codeToRun(){ digitalWrite(0,HIGH); //Blink pin. Change code here. delay(1000); digitalWrite(0,LOW); } void loop() { if (f_wdt==1){ // wait for timed out watchdog / flag is set when a watchdog timeout occurs f_wdt=0; // reset flag sleepCounter++; if (sleepCounter == 10){ //Only execute every 10 sleep cycles sleepCounter = 0; delay (1); codeToRun(); //Execute code } f_wdt=0; // reset flag system_sleep(); } } void system_sleep() { // set system into the sleep state, system wakes up when wtchdog is timed out cbi(ADCSRA,ADEN); // switch Analog to Digitalconverter OFF, can be moved to Setup if alsways off set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here sleep_enable(); sleep_mode(); // System sleeps here sleep_disable(); // System continues execution here when watchdog timed out sbi(ADCSRA,ADEN); // switch Analog to Digitalconverter ON } void setup_watchdog(int ii) { byte bb; int ww; if (ii > 9 ) ii=9; bb=ii & 7; if (ii > 7) bb|= (1<<5); bb|= (1<